//对象

////JS用一个{...}表示对象，用[xxx:xxx]表示申明，用逗号隔开
var ljy={
    name:'辣椒油',        //期间用逗号隔开
    height:178,
    weight:80,
    birthday:'2001-12-19',
    adress:'福建',
    'midle-school':'中心小学'   //前面有特殊字符要用''括起来
}
console.log(ljy)   //输出全部信息
console.log(ljy.name)   //只输出姓名
console.log(ljy['midle-school'])  //输出含有特殊字符的学校，因为midle-school不是有效变量，所以用['xxx']来访问
console.log(ljy['name'])  //姓名也可以这样输出,但最好使用标准变量名
console.log(ljy.age)   //访问一个不存在的变量，JS不会报错，而是返回undefined
ljy.age=20;    //增加一个age变量
console.log(ljy.age)   //输出20
delete ljy.age;   //删除一个age变量
console.log(ljy.age)   //输出undefined
ljy['like']='音乐';     //增加或删除也可用['xxx']的形式表示
console.log(ljy.like)
delete ljy.hobby;   //删除不存在的变量输出undefined
console.log(ljy.hobby)   

//检测ljy是否拥有某一个属性，用in操作字符
console.log('name' in ljy)    //name存在，所以输出true
console.log('phone' in ljy)    //phone不存在，所以输出false
//如果in判断一个属性存在，这个属性不一定是xiaoming的，它可能是xiaoming继承得到的：
console.log('toString' in ljy);    //true,因为toString定义在object对象中，而所有对象在原型链中最后都会指向object，所以ljy也拥有toString属性
//要判断一个属性是自身拥有的而不是继承的，用hasOwnProPerty()
console.log(ljy.hasOwnProperty('adress'));  //true
console.log(ljy.hasOwnProperty('toString'));  //false

////上面指定一个变量必须加ljy


//-----------------------------------------------------------------------------------------------
//判断

///JS使用if{...}else{...}来进行条件判断
var age =19
if( age >= 18){
    alert('你成年啦！')   //alert为窗口弹出
}else{
    alert('嗨，小学生！')
}
//其中else{}语句是可选的，如果语句块中只包含一条语句，（）是可省略的
var age=17
if(age>=18)
    alert('你成年啦！')
else
    alert('嗨，小学生！')
//我们一般要加上{}，怕中间添加日志忘记加括号
var age = 5;
if (age >= 18) {
        alert('adult');
} else {
    console.log('age < 18');   //若age<18，则在控制台输出age<18，窗口弹出teenager
    alert('teenager');
}
//多行条件判断
//练习


//-----------------------------------------------------------------------------------------------
//循环

///要计算1+2+3，可直接写表达式
console.log(1+2+3);   //6
//那1+2+3+...+10000呢？不可能就直接写表达式了
//JS循环语句有两种，一种是for循环，通过初始条件、结束条件、递增条件来执行循环语块
var aa=0
var i
for (i = 1; i <= 10000; i++) {    //i=1是初始条件，i<=10000是结束条件，i++是递增条件
    aa=aa+i
}
console.log(aa);    //500500
//练习，利用for循环实现1*2*3*...*10
var ss=1
var i
for (i  = 1; i <= 10; i++) {
    ss=ss*i
}
console.log(ss);
if (ss === 3628800) {
    console.log('1 x 2 x 3 x ... x 10 = ' + ss);
}
else {
    console.log('计算错误');
}

//for循环最常用的地方是利用索引来遍历数组
var arr = ['Apple', 'Google', 'Microsoft'];
var i, x;
for (i=0; i<arr.length; i++) {
    x = arr[i];
    console.log(x);   //依次输出arr
}
//若循环进入到无限循环，必须用break条件终止循环，否则将进入死循环
var x=0;
for(;;){   //无限循环
    if(x>10){
        break;  //通过if判断退出循环
    }
    x++;
    console.log(x);
} 

//for ...in循环，可以把属性依次列出来
var o={
    name:'ljy',
    age:45,
    adress:'福建'
}
for (var key in o) {
    console.log(key);  //name age adress
}
//过滤掉继承属性，用hasOwnProperty实现
for (var key in o) {
    if (o.hasOwnProperty(key)) {
        console.log(key);    //name age adress
    }
}

//因为Array也是对象，所以for ... in也可以直接循环索引
var p=['A','B','C']
for(var i in p){
    console.log(i);   //0 1 2
    console.log(p[i]);  //A B C
}

//while
////while循环只有一个判断条件，条件满足就不断循环，条件不满足，则退出循环，例如：计算100以内的奇数和
var x=0
var n=99
while(n>0){
    x=x+n;   //n等于99，先从99开始加
    n=n-2    //n依次等于97、95...1,依次加上
}
console.log(x);   //2500
///在while内部循环自减，当n=-1时，不满足while条件，则退出循环

//do while
///还有一种情况是do{...}while()循环，他不是每次循环开始时判断条件，而是每次循环机结束时判断条件
var n=0
do{
    n=n+1
}while(n<100)
console.log(n);   ///100
///用do{...}while()要小心，，可能会少循环一次，而for和循环可能会一次都不执行

//练习，请利用循环遍历数组中的每个名字，并显示Hello, xxx!：
var arr = ['Bart', 'Lisa', 'Adam'];
for (i  = 0;  i < arr.length; i++) {
    console.log('Hello,'+arr[i]+'!');
}